#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>




int main()
{
  printf("程序开始运行\n");
  pid_t a = fork();
  if(a == 0) printf("我是一个还没有被替换的子进程，此时我的pid是：%d\n",getpid());
  if(a == 0)
  {
    execl("/home/wch/303/ceshi","ceshi",NULL);  //应该给一个编译好的C文件，而不是C的源文件，这么做没啥用
    _exit(1);
  }
  else{
  waitpid(-1,NULL,0);
  printf("程序运行完毕\n");
  }
  return 0;
}














//int main()
//{
//  printf("程序替换开始\n");
//  pid_t a = fork();
//  if(a == 0)
//  {
//    char const* argv[] = {"ls",(char* const)"-l",(char* const)"-a",NULL};
//    //execv("/usr/bin/ls",(char* const*)argv); 
//    execvp("ls",(char* const*)argv);
//  }
//  waitpid(-1,NULL,0);
//  printf("程序替换完毕\n");
//  return 0;
//}






//int main()
//{
//  printf("程序替换开始\n");
//  pid_t a = fork();
//  if(a == 0)
//  {
//    char const* argv[] = {"ls",(char* const)"-l",(char* const)"-a",NULL};
//    execv("/usr/bin/ls",(char* const*)argv);//这个函数的作用其实和之前的execl系列的函数差不多，不过此时函数传递的第二个参数不再是命令行参数了，而实一个粗放命令行参数指针数组，此时记得要把我们写好的argv强制行转换成左边的
//  }
//  waitpid(-1,NULL,0);
//  printf("程序替换完毕\n");
//  return 0;
//}






//int main()
//{
//  pid_t a = fork();
//  if(a == 0)
//  {
//    printf("我是子进程，此时我的pid是：%d\n",getpid());
//   // execlp("ls","ls","-a","-l",NULL); //第一个一定是路径，此时这个函数只要提供我们所要执行的文件名即可，因为此时它会自动帮我们从环境变量找到相关的路径，第二个一定是命令行参数，此时ls不要忘记，他也是命令行参数，和第一个不起冲突，如果不这么写会出错的
//    execlp("pwd","pwd",NULL);
//  }
//  waitpid(-1,NULL,0);
//    printf("我是父进程，此时我的pid是：%d\n",getpid());
//  return 0;
//
//}







//int main()
//{
//  //execl("/usr/bin/ls","ls","-a","-l",NULL);  //不要忘记路径都是/来进行分割的，所以usr前面的/不可以忘掉
//  pid_t a = fork();
//  if(a == 0)
//  {
//    printf("我是一个子进程，我的pid是：%d\n",getpid());
//    execl("/usr/bin/pwd","pwd",NULL);  //通过这段代码可以知道此时execl进程进程替换的时候，会从这里开始把代码和数据替换过来，此时这个函数后面的代码也会被替换掉
//    printf("我是一个子进程，我的pid是：%d\n",getpid());
//  }
//  waitpid(-1,NULL,0);
//  printf("我是一个父进程，我的pid是：%d\n",getpid());  //从这里可以看出此时子进程进行程序替换并不会影响到父进程，可以看出进程的独立性，以及写实拷贝
//  return 0;
//}





//int main()
//{
//  printf("我是一个父进程，我的pid是：%d\n",getpid());
//  pid_t a = fork();
//  if(a == 0)
//  {
//    int cut  = 5;
//    while(cut)
//    {
//      printf("我是一个子进程，我的pid是：%d，我的父进程pid是：%d\n",getpid(),getppid());
//      sleep(1);
//      cut--;
//    }
//    exit(1);
//  }
//  sleep(1);
//  int status = 0;
//  pid_t rid = waitpid(-1,&status,0);
//  if(rid > 0) printf("子进程已经成功的退出了\n");
//  else if(rid == 0) printf("子进程退出失败\n");
//  else printf("失败\n");
//  printf("我是一个父进程，我的pid是：%d\n",getpid());
//  return 0;
//}






//int main()
//{
//  printf("我是一个父进程，我的pid是：%d\n",getpid());
//  pid_t a = fork();
//  while(1){
//  if(a == 0){
//  printf("我是一个子进程，我的pid是：%d，我的父进程pid是：%d\n",getpid(),getppid());
//  sleep(2);
//  exit(1);
//  }
//  else{
//  printf("我是一个父进程，我的pid是：%d\n",getpid());
//  sleep(2);
//  }
//  }
//  return 0;
//}
